/****************************************
 * 2018 - 2021 版权所有 CopyRight(c) 快程乐码信息科技有限公司所有, 未经授权，不得复制、转发
 */

package com.pxxy.springboot.webcase.exhandler;

import com.pxxy.springboot.webcase.entity.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

/******************
 * @Author yejf
 * @Version v1.0
 * @Create 2020-12-16 13:39
 * @Description 利用 @ControllerAdvice + @ExceptionHandler 来做Spring MVC的全局异常处理
 */
@Component
@ControllerAdvice  //对控制器的一个增强【AOP】
public class GlobalExceptionHandler {

    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    public GlobalExceptionHandler() {
        log.debug(">>> 初始化 GlobalExceptionHandler 实例....");
    }

    @Value("${multipart.max-file-size}")
    private String maxFileSize;
    /*****
     * 此方法针对RuntimeException进行处理
     * @return 返回即为提示的信息，也可以进行封装后，转换成json
     */
    @ExceptionHandler(RuntimeException.class) //指定要处理的异常类型
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)  //还可以指定响应的状态
    @ResponseBody  //以返回值做为响应体
    public Object catchRuntimeException(RuntimeException e) {
        log.debug(e.getMessage());
        Result result = new Result();
        result.setStatus("failure");
        if(e instanceof MaxUploadSizeExceededException) {
            log.warn("---> 上传的文件大小超出了限制: "+maxFileSize);
            result.setData("上传的图片大小超过了限制："+maxFileSize);
        } else {
            result.setData(e.getMessage());
        }
        return result;  //Spring Boot 会自动把此对象转换成 json
    }

    //@ExceptionHandler()  //这里可以指定多个自定义的异常
    //public Object catchCustomException(Exception e) {

    //}
}
